Software-based Electronic Design Automation (EDA) tools, in general, can process circuit designs through what is referred to as an “implementation flow”. The term “implementation flow” refers to the various processes and tasks that must be performed on a circuit design to implement that circuit design within a target programmable logic device (PLD). A circuit design can be specified in programmatic form, e.g., using a hardware description language. A typical implementation flow entails various phases, or stages, such as synthesis, translation, packing, placement, and routing. After subjecting a circuit design to these phases of implementation, the resulting circuit design can be transformed into a bitstream. When loaded into a target PLD, the bitstream configures the device to implement the circuit design.
Some EDA tools provide macro functionality. The term “macro” generally refers to an implementation of a particular circuit function, e.g., a counter, a shift register, arithmetic operators, etc. The macro can be viewed as a “black box”, in which the internal workings of the macro are largely irrelevant to the end user. Each macro can provide an efficient, optimized version of the particular circuit function implemented by that macro. For example, a macro can be created and refined with respect to the primitives available for use on the target PLD and the architecture of the target PLD.
The phrase “macro inference” generally refers to a process in which portions of a circuit design are replaced with suitable macros, e.g., a macro that is functionally equivalent to the portion of the circuit design that is being replaced. As such, macro inference provides one way in which circuit designs can be optimized, whether in terms of area usage, speed, timing, power consumption, or the like.